

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

interface IPerson{
    void findLove();
}

class ZhangSan implements IPerson{

    public void findLove() {
        System.out.println("符合要求");
    }

    public void say(){
        System.out.println("hello");
    }
}

public class JDKMeipo implements InvocationHandler {
    //被代理的对象
    private IPerson target;

    public IPerson getInstance(IPerson target){
        this.target = target;
        Class<? extends IPerson> clazz = target.getClass();
        /*第一个参数: 用哪个类加载器去加载代理对象
        第二个参数:动态代理类需要代理的方法
        第三个参数:动态代理方法在执行时，会调用h里面的invoke方法去执行*/
        return (IPerson) Proxy.newProxyInstance(clazz.getClassLoader(),clazz.getInterfaces(),this);
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        before();
        Object result = method.invoke(this.target, args);
        after();
        return result;
    }

    private void before(){
        System.out.println("开始物色");
    }

    private void after(){
        System.out.println("开始交往");
    }

    public static void main(String[] args) {
        JDKMeipo jdkMeipo = new JDKMeipo();

        IPerson zhangsanProxy = jdkMeipo.getInstance(new ZhangSan());
        zhangsanProxy.findLove();

        //代理类只能调用接口中的方法
//        zhangsanProxy.say();
    }


}
